package model

import (
	"common/global"
	"time"
)

type OrderMaster struct {
	Id            int64     `gorm:"column:id;type:bigint;comment:主订单ID;primaryKey;not null;" json:"id"`                                  // 主订单ID
	OrderNo       string    `gorm:"column:order_no;type:varchar(32);comment:订单编号;not null;" json:"order_no"`                             // 订单编号
	UserId        int64     `gorm:"column:user_id;type:int;comment:用户ID;not null;" json:"user_id"`                                       // 用户ID
	ProductId     int64     `gorm:"column:product_id;type:mediumint;comment:商品ID;not null;" json:"product_id"`                           // 商品ID
	OrderType     int64     `gorm:"column:order_type;type:tinyint;comment:订单类型：1=普通订单，2=拼团订单，3=砍价订单，4=秒杀订单;not null;" json:"order_type"` // 订单类型：1=普通订单，2=拼团订单，3=砍价订单，4=秒杀订单
	OriginalPrice float64   `gorm:"column:original_price;type:decimal(8, 2);comment:原价;not null;" json:"original_price"`                 // 原价
	ActualPrice   float64   `gorm:"column:actual_price;type:decimal(8, 2);comment:实付价格;not null;" json:"actual_price"`                   // 实付价格
	Quantity      int64     `gorm:"column:quantity;type:int;comment:商品数量;not null;default:1;" json:"quantity"`                           // 商品数量
	Status        int64     `gorm:"column:status;type:tinyint;comment:支付状态 1已支付 2未支付 3待支付 4已取消;not null;default:3;" json:"status"`       // 支付状态 1已支付 2未支付 3待支付 4已取消
	PaymentTime   time.Time `gorm:"column:payment_time;type:datetime;comment:支付时间;default:NULL;" json:"payment_time"`                    // 支付时间
	CreatedAt     time.Time `gorm:"column:created_at;type:datetime;comment:创建时间;not null;" json:"created_at"`                            // 创建时间
	UpdatedAt     time.Time `gorm:"column:updated_at;type:datetime;comment:更新时间;not null;" json:"updated_at"`                            // 更新时间
}

func (m *OrderMaster) TableName() string {
	return "order_master"
}

// OrderCrete 订单创建
func OrderCrete(o *OrderMaster) (order *OrderMaster, err error) {
	err = global.Db.Create(&o).Error
	if err != nil {
		return nil, err
	}
	return o, nil
}

// GetOrderIdInfo 根据订单号查询订单信息
func GetOrderIdInfo(sn string) (result *OrderMaster, err error) {
	var o OrderMaster
	err = global.Db.Where("order_no = ?", sn).Limit(1).Find(&o).Error
	if err != nil {
		return nil, err
	}
	return &o, nil
}

// OrderUpdatePaid 订单支付状态修改
func OrderUpdatePaid(sn string, sta int64) (err error) {
	updateData := map[string]interface{}{
		"status": sta,
	}

	// 如果是支付成功状态(1)，则更新支付时间
	if sta == 1 {
		updateData["payment_time"] = time.Now()
		updateData["updated_at"] = time.Now()
	}

	err = global.Db.Model(&OrderMaster{}).Where("order_no = ?", sn).Updates(updateData).Error
	if err != nil {
		return err
	}
	return nil
}

func GetOrderCatInfo(id int64) (result *OrderMaster, err error) {
	err = global.Db.Where("id =?", id).Limit(1).Find(&result).Error
	if err != nil {
		return nil, err
	}
	return result, nil
}

func OrderMasterDelete(master *OrderMaster) {
	global.Db.Delete(master)
}

func ExistOrder(userId, productId int64, sta []int64) (result *OrderMaster, err error) {
	err = global.Db.Model(&OrderMaster{}).Where("user_id =? AND product_id =? AND status IN ?", userId, productId, sta).First(&result).Error
	if err != nil {
		return nil, err
	}
	return result, nil
}

// UpdateOrderMaster 更新订单信息
func UpdateOrderMaster(order *OrderMaster) error {
	err := global.Db.Save(order).Error
	if err != nil {
		return err
	}
	return nil
}

// GetOrderList 获取用户订单列表
func GetOrderList(uid, status int64, offset, limit int64) (result []*OrderMaster, total int64, err error) {
	query := global.Db.Model(&OrderMaster{}).Where("user_id = ?", uid)

	// 如果status不为0，则按状态筛选
	if status != 0 {
		query = query.Where("status = ?", status)
	}

	// 获取总数
	err = query.Count(&total).Error
	if err != nil {
		return nil, 0, err
	}

	// 分页查询
	err = query.Order("created_at DESC").Offset(int(offset)).Limit(int(limit)).Find(&result).Error
	if err != nil {
		return nil, 0, err
	}
	return result, total, nil
}
